package com.gw.crm.utils;

import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.security.SecureRandom;
import java.util.Base64;

/**
 * AES加密工具类，提供加密和解密功能
 *
 * @Author:xxt
 * @Description: AES加密工具类，提供加密和解密功能
 * @Date: 2024/9/13
 */
public class AESUtil {
    // AES算法名称
    private static final String ALGORITHM = "AES";
    // 密钥大小，使用256位密钥
    private static final int KEY_SIZE = 256;

    //统一指定字符集为UTF-8
    private static final String CHARSET = "UTF-8";

    /**
     * 生成AES密钥
     *
     * @return 生成的密钥，以Base64编码的字符串形式表示
     * @throws Exception 如果算法错误或密钥生成过程中出现异常
     */
    public static String generateKey() throws Exception {
        // 获取AES算法的密钥生成器
        KeyGenerator keyGenerator = KeyGenerator.getInstance(ALGORITHM);
        // 初始化密钥生成器，使用256位密钥大小和安全随机数生成器
        keyGenerator.init(KEY_SIZE, new SecureRandom());
        // 生成密钥
        SecretKey secretKey = keyGenerator.generateKey();
        // 将密钥编码为Base64字符串并返回
        return Base64.getEncoder().encodeToString(secretKey.getEncoded());
    }

    /**
     * 使用AES算法加密数据
     *
     * @param data 待加密的数据
     * @param key  用于加密的密钥，需是Base64编码的字符串
     * @return 加密后的数据，以Base64编码的字符串形式表示
     * @throws Exception 如果加密过程中出现异常
     */
    public static String encrypt(String data, String key) throws Exception {
        // 获取AES算法的密码器
        Cipher cipher = Cipher.getInstance(ALGORITHM);
        // 初始化密码器为加密模式，使用Base64解码后的密钥
        cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(Base64.getDecoder().decode(key), ALGORITHM));
        // 加密数据并指定字符集，确保数据编码的一致性
        byte[] encryptedBytes = cipher.doFinal(data.getBytes((CHARSET)));
        // 将加密后的数据编码为Base64字符串并返回
        return Base64.getEncoder().encodeToString(encryptedBytes);
    }

    /**
     * 使用AES算法解密数据
     *
     * @param encryptedData 待解密的数据，以Base64编码的字符串形式表示
     * @param key           用于解密的密钥，需是Base64编码的字符串
     * @return 解密后的原始数据字符串
     * @throws Exception 如果解密过程中出现异常
     */
    public static String decrypt(String encryptedData, String key) throws Exception {
        // 获取AES算法的密码器
        Cipher cipher = Cipher.getInstance(ALGORITHM);
        // 初始化密码器为解密模式，使用Base64解码后的密钥
        cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(Base64.getDecoder().decode(key), ALGORITHM));
        // 解密数据
        byte[] decryptedBytes = cipher.doFinal(Base64.getDecoder().decode(encryptedData));
        // 返回解密后的字符串并使用指定的字符集 CHARSET 进行解码
        return new String(decryptedBytes,CHARSET);
    }

}

